home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
001-025
/
scopedisk19
/
blinker
/
basiclinker.exe
< prev
next >
Wrap
Text File
|
1995-03-18
|
4KB
|
150 lines
DIM ModulesUsed$(40)
DIM SHARED TRUE,FALSE,NoError
TRUE = -1
FALSE = 0
ON ERROR GOTO ProcessError
NoError = TRUE
CALL GetLinkerInfo.SUB(ProgramName$,LibraryPathname$,ProgramPathname$,Compress)
OPEN ProgramPathname$+ProgramName$+".EXE" FOR OUTPUT AS #2 LEN = 4096
IF NoError THEN
CALL LinkModules.SUB(ProgramName$,ModulesUsed$(),Used,ProgramCreated)
IF ProgramCreated THEN
PRINT "Link Complete - Program saved as ";ProgramName$;".EXE"
ELSE
PRINT "Link Failed"
END IF
ELSE
PRINT "Unable to open output file - Link Failed"
END IF
CLOSE 2
END
ProcessError:
IF ERR = 53 OR ERR = 61 OR ERR = 64 OR ERR = 68 OR ERR = 70 THEN
NoError = FALSE
IF ERR = 70 THEN
PRINT "Disk write-protected!"
ELSEIF ERR = 61 THEN
PRINT "Disk FULL!"
ELSE
PRINT "Unable to access file."
END IF
RESUME NEXT
ELSE
ON ERROR GOTO 0
END IF
SUB GetLinkerInfo.SUB(ProgramName$,LibPath$,PrgPath$,Compress) STATIC
ProgramName$ = ""
WHILE ProgramName$ = ""
INPUT "Program name";ProgramName$
WEND
INPUT "Library pathname";LibPath$
IF LEN(LibPath$) > 4 AND RIGHT$(LibPath$,1) <> "/" THEN
LibPath$ = LibPath$ + "/"
END IF
INPUT "Program pathname";PrgPath$
IF LEN(PrgPath$) > 4 AND RIGHT$(PrgPath$,1) <> "/" THEN
PrgPath$ = PrgPath$ + "/"
END IF
INPUT "Compress (Y or N)";Answer$
IF UCASE$(Answer$) = "Y" THEN
Compress = TRUE
ELSE
Compress = FALSE
END IF
END SUB
SUB LinkModules.SUB(ProgramName$,ModulesUsed$(1),Used,BuildComplete) STATIC
DIM ModulesCalled$(40)
BuildComplete = FALSE
Used = 1
Scanned = 0
ModulesUsed$(Used) = ProgramName$
RepeatUntil = TRUE
WHILE RepeatUntil
ModuleName$ = ModulesUsed$(Scanned + 1)
CALL ScanModule.SUB(ModuleName$,ModulesCalled$(),Called,ModuleScanned)
IF Called > 0 THEN
FOR x = 1 TO Called
IsNotIn = TRUE
FOR y = 1 TO Used
IF UCASE$(ModulesCalled$(x)) = UCASE$(ModulesUsed$(y)) THEN IsNotIn = FALSE
NEXT y
IF IsNotIn THEN
Used = Used + 1
ModulesUsed$(Used) = ModulesCalled$(x)
END IF
NEXT x
END IF
Scanned = Scanned + 1
IF (Used = Scanned) OR (NOT ModuleScanned) THEN RepeatUntil = FALSE
WEND
BuildComplete = ModuleScanned
END SUB
SUB ScanModule.SUB(ModuleName$,ModulesCalled$(1),Called,ModuleScanned) STATIC
SHARED LibraryPathname$,Compress
Called = 0
PRINT "Scanning module ";ModuleName$
OPEN LibraryPathname$+ModuleName$ FOR INPUT AS #1 LEN = 4096
IF NoError THEN
WHILE NoError AND (NOT EOF(1))
LINE INPUT#1,SourceLine$
CALL CommentCheck.SUB(SourceLine$,LineIsComment)
IF NOT (LineIsComment AND Compress) THEN
PRINT #2,SourceLine$
END IF
IF NOT LineIsComment THEN
CALL ScanLine.SUB(SourceLine$,ModuleCall$)
IF ModuleCall$ <> "" THEN
Called = Called + 1
ModulesCalled$(Called) = ModuleCall$
END IF
END IF
WEND
END IF
IF NoError THEN
ModuleScanned = TRUE
ELSE
ModuleScanned = FALSE
END IF
CLOSE #1
END SUB
SUB CommentCheck.SUB(SourceLine$,LineIsComment) STATIC
LineIsComment = FALSE
Uline$ = UCASE$(SourceLine$)
CharPos = 1
Nonblank = FALSE
WHILE (NOT Nonblank) AND CharPos <= LEN(Uline$)
IF MID$(Uline$,CharPos,1) <> " " THEN
Nonblank = TRUE
ELSE
CharPos = CharPos + 1
END IF
WEND
IF Nonblank THEN
IF MID$(Uline$,CharPos,1) = "'" OR MID$(Uline$,CharPos,3) = "REM" THEN
LineIsComment = TRUE
END IF
ELSE
LineIsComment = TRUE
END IF
END SUB
SUB ScanLine.SUB(SourceLine$,ModuleCall$) STATIC
ModuleCall$ = ""
ThisLine$ = " " + SourceLine$
CALL CommentCheck.SUB(ThisLine$,LineIsComment)
IF NOT LineIsComment THEN
C = INSTR(UCASE$(ThisLine$)," CALL ")
IF C > 0 THEN
Character = C + 6
WHILE MID$(ThisLine$,Character,1) = " "
Character = Character + 1
WEND
C = Character
C = INSTR(C,UCASE$(ThisLine$),".SUB")
IF C > 0 THEN
Length = (C + 4) - Character
ModuleCall$ = MID$(ThisLine$,Character,Length)
END IF
END IF
END IF
END SUB